//
//  IWOAuthViewCtrl.m
//  WeiBo17
//
//  Created by teacher on 15/8/19.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#import "IWOAuthViewCtrl.h"
#import "AFNetworking.h"
#import "IWAccount.h"
#import "AppDelegate.h"
#import "IWTabBarController.h"
#import "IWAccountTool.h"

#define APP_KEY @"2464411813"

#define APP_SECRET @"6a5f124dfb3a5035ec8a242fdada8142"

//授权回调页
#define REDIRECT_URI @"http://www.baidu.com/"

@interface IWOAuthViewCtrl () <UIWebViewDelegate>

@end

@implementation IWOAuthViewCtrl

- (void)viewDidLoad
{
    [super viewDidLoad];

    //初始化一个WebView
    UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    webView.delegate = self;
    [self.view addSubview:webView];

    //加载网址
    NSString* urlStr = [NSString stringWithFormat:@"https://api.weibo.com/oauth2/authorize?client_id=%@&redirect_uri=%@", APP_KEY, REDIRECT_URI];

    NSURL* url = [NSURL URLWithString:urlStr];

    //通过url初始化一个请求
    NSURLRequest* request = [[NSURLRequest alloc] initWithURL:url];
    //加载请求
    [webView loadRequest:request];
}

#pragma mark - webview delegate

//这个方法就是告诉webView是否需要加载某个request
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{

    NSString* urlStr = request.URL.absoluteString;
    //如果判断到是要回调授权成功页的话,返回NO,并且获取地址当中的code(授权码)
    //    "qiwuoeyroiquweytaaaiuqe"       "aaa"
    if ([urlStr hasPrefix:REDIRECT_URI]) {
        //就代表点击的是授权,把授权code去提取出来
        //http://www.baidu.com/?code=a858c7ca1995d3e6fe97db303389db45

        NSRange range = [urlStr rangeOfString:@"code="];
        NSString* code = [urlStr substringFromIndex:range.location + range.length];

        NSLog(@"%@", urlStr);
        NSLog(@"%@", code);

        //从哪儿开始截取到最后
        //        [urlStr substringFromIndex:<#(NSUInteger)#>]
        //从0开始,截取到哪一个位置

        //        [urlStr substringToIndex:3];

        //TODO 去获取访问令牌
        [self getAccessTokenWithCode:code];

        return NO;
    }

    return YES;
}

/**
 *  获取授权的code
 *
 *  @param code
 */
- (void)getAccessTokenWithCode:(NSString*)code
{

    //获取请求的管理者
    AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
    //请求的地址
    NSString* urlStr = @"https://api.weibo.com/oauth2/access_token";
    //返回数据的序列化器-->如果不指定默认使用json序列化器,而json的序列化器不支持:text/plain,所以我直接在AFN框架里面去添加我们的代码
    //封装参数

    //    必选	类型及范围	说明
    //    client_id	true	string	申请应用时分配的AppKey。
    //    client_secret	true	string	申请应用时分配的AppSecret。
    //    grant_type	true	string	请求的类型，填写authorization_code
    //
    //    grant_type为authorization_code时
    //    必选	类型及范围	说明
    //    code	true	string	调用authorize获得的code值。
    //    redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。

    NSMutableDictionary* params = [NSMutableDictionary dictionary];
    params[@"client_id"] = APP_KEY;
    params[@"client_secret"] = APP_SECRET;
    params[@"grant_type"] = @"authorization_code";
    params[@"code"] = code;
    params[@"redirect_uri"] = REDIRECT_URI;

    //发送post请求
    [manager POST:urlStr
        parameters:params
        success:^(AFHTTPRequestOperation* operation, NSDictionary* responseObject) {
            NSLog(@"%@", responseObject);
            IWAccount* account = [[IWAccount alloc] init];
            //系统自带的字典转模型
            [account setValuesForKeysWithDictionary:responseObject];
            NSLog(@"%@", account);

            //路径
            [IWAccountTool saveAccount:account];


            //跳转到主页面
            IWTabBarController* tabCtrl = [[IWTabBarController alloc] init];

            //[UIApplication sharedApplication].keyWindow通过这句代码取出来的window在某些情下有可不是appdelegate里面的window
            //UIAlertView弹出的情况下,点击Enter的时候去调用这个方法去获取window就不是我们app展示的主window
            //我们在切换根控制器的时候,为了以防上面的情况
            UIWindow* window = ((AppDelegate*)[UIApplication sharedApplication].delegate).window;
            //切换根控制器
            window.rootViewController = tabCtrl;

        }
        failure:^(AFHTTPRequestOperation* operation, NSError* error) {
            NSLog(@"请求失败:%@", error);
        }];
}

@end
